﻿using System;
using System.Timers; // 明确导入 System.Timers

namespace AlarmClockDemo
{
    // 定义事件参数类
    public class AlarmClockEventArgs : EventArgs
    {
        public DateTime CurrentTime { get; }
        public AlarmClockEventArgs(DateTime currentTime)
        {
            CurrentTime = currentTime;
        }
    }

    // 闹钟类
    public class AlarmClock
    {
        // 定义委托
        public delegate void AlarmClockEventHandler(object sender, AlarmClockEventArgs e);

        // 定义事件
        public event AlarmClockEventHandler Tick;
        public event AlarmClockEventHandler Alarm;

        private readonly System.Timers.Timer _timer; // 明确使用 System.Timers.Timer
        private DateTime? _alarmTime;

        public AlarmClock()
        {
            // 初始化定时器，每秒触发一次
            _timer = new System.Timers.Timer(1000);
            _timer.Elapsed += TimerElapsed;
        }

        // 设置闹钟时间
        public void SetAlarm(DateTime alarmTime)
        {
            _alarmTime = alarmTime;
            Console.WriteLine($"闹钟已设置为：{alarmTime:HH:mm:ss}");
        }

        // 启动闹钟
        public void Start()
        {
            _timer.Start();
            Console.WriteLine("闹钟已启动");
        }

        // 停止闹钟
        public void Stop()
        {
            _timer.Stop();
            Console.WriteLine("闹钟已停止");
        }

        // 定时器触发事件
        private void TimerElapsed(object sender, ElapsedEventArgs e)
        {
            DateTime currentTime = DateTime.Now;

            // 触发Tick事件
            Tick?.Invoke(this, new AlarmClockEventArgs(currentTime));

            // 检查是否到达闹钟时间
            if (_alarmTime.HasValue &&
                currentTime.Hour == _alarmTime.Value.Hour &&
                currentTime.Minute == _alarmTime.Value.Minute &&
                currentTime.Second == _alarmTime.Value.Second)
            {
                Alarm?.Invoke(this, new AlarmClockEventArgs(currentTime));
                _alarmTime = null; // 闹钟响后清除设置
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 创建闹钟实例
            AlarmClock clock = new AlarmClock();

            // 订阅事件
            clock.Tick += (sender, e) =>
                Console.WriteLine($"嘀嗒: 当前时间 {e.CurrentTime:HH:mm:ss}");

            clock.Alarm += (sender, e) =>
                Console.WriteLine($"响铃! 闹钟时间到: {e.CurrentTime:HH:mm:ss}");

            // 设置闹钟（当前时间后10秒）
            DateTime alarmTime = DateTime.Now.AddSeconds(10);
            clock.SetAlarm(alarmTime);

            // 启动闹钟
            clock.Start();

            // 让程序运行一段时间
            Console.WriteLine("按任意键停止闹钟...");
            Console.ReadKey();

            // 停止闹钟
            clock.Stop();
        }
    }
}